package com.bryantkobe.myspringcode.utils;

import java.util.*;

/**
 * @description: 父产品ID保留处理
 * @author: alienwarezzl
 * @date: 2025/7/6
 */
public class ParentProductIdProcessor {
    // Trie节点类
    static class TrieNode {
        Map<Character, TrieNode> children = new HashMap<>();
        boolean isEndOfWord; // 标记完整单词（即存在的父ID）
    }

    // 插入单词到Trie
    private static void insert(TrieNode root, String word) {
        TrieNode current = root;
        for (char c : word.toCharArray()) {
            current = current.children.computeIfAbsent(c, k -> new TrieNode());
        }
        current.isEndOfWord = true;
    }

    public static Set<String> removeChildIDs(Set<String> ids) {
        // 步骤1：构建根产品ID的Trie树
        TrieNode root = new TrieNode();
        Set<String> rootIDs = new HashSet<>();

        // 收集纯字母ID作为根产品ID，并插入Trie
        for (String id : ids) {
            if (id.matches("[a-zA-Z]+")) {
                insert(root, id);
                rootIDs.add(id);
            }
        }

        // 步骤2：标记待移除的子产品ID
        Set<String> toRemove = new HashSet<>();

        for (String id : ids) {
            // 跳过根产品ID（需要保留）
            if (rootIDs.contains(id)) continue;

            // 情况1：处理TEMP格式（父ID + "TEMP"）
            if (id.endsWith("TEMP")) {
                // 提取父ID候选（去掉末尾的"TEMP"）
                String parentCandidate = id.substring(0, id.length() - 4);
                // 验证父ID是否有效
                if (isValidParent(root, parentCandidate)) {
                    toRemove.add(id);
                    continue;
                }
            }

            // 情况2：处理原有格式（父ID + 年份(可选) + _ + 其他字段）
            TrieNode current = root;
            int lastValidParentEnd = -1;

            // 遍历ID字符，在Trie中查找所有可能的父ID
            for (int i = 0; i < id.length(); i++) {
                char c = id.charAt(i);
                current = current.children.get(c);

                // 当前字符不在Trie中，停止搜索
                if (current == null) break;

                // 找到有效的根产品ID
                if (current.isEndOfWord) {
                    lastValidParentEnd = i;
                }
            }

            // 检查是否找到有效父ID
            if (lastValidParentEnd >= 0) {
                String parent = id.substring(0, lastValidParentEnd + 1);
                String suffix = id.substring(lastValidParentEnd + 1);

                // 验证子ID格式：剩余部分必须包含下划线且下划线后有内容
                if (!suffix.isEmpty() && suffix.indexOf('_') != -1 &&
                        suffix.indexOf('_') < suffix.length() - 1) {
                    toRemove.add(id);
                }
            }
        }

        // 步骤3：创建结果集合并移除标记的子ID
        Set<String> result = new HashSet<>(ids);
        result.removeAll(toRemove);
        return result;
    }

    // 检查父ID是否有效（存在于Trie中）
    private static boolean isValidParent(TrieNode root, String parent) {
        TrieNode current = root;
        for (char c : parent.toCharArray()) {
            current = current.children.get(c);
            if (current == null) return false;
        }
        return current.isEndOfWord;
    }

    // 测试示例
    public static void main(String[] args) {
        Set<String> ids = new HashSet<>();
        Collections.addAll(ids,
                "AA", "AAA", "AATEMP", "AA2023_123", "AA_456",
                "AAA_789", "AAA_789_234", "INVALID_ID", "CC_TEMP", "AAB_TEMP"
        );

        Set<String> filteredIds = removeChildIDs(ids);
        System.out.println("过滤后: " + filteredIds);
        /* 预期输出：
           [AA, AAA, BB, INVALID_ID, CC_TEMP, AAB_TEMP]
           解释：
           - AATEMP、AA2023_123、AA_456、AAA_789 被移除（子产品ID）
           - AA 和 AAA 保留（父产品ID）
           - BB 保留（无子产品的父ID）
           - INVALID_ID 保留（无效格式）
           - CC_TEMP 保留（父ID CC 不存在）
           - AAB_TEMP 保留（父ID AAB 不存在）
        */
    }
}
